﻿<?php
class indexation{
	public $chaine,$poids,$product_info_id;
	
	public function  __construct($prd_product_id,$chaine='',$poids=2){
		$this->chaine=$chaine;
		$this->poids=$poids;
		$this->product_info_id=$prd_product_id;
		return $this;
	}

	function mot_commun($table='index_stop_words'){
		$CI=get_instance();
		$CI->load->database();
		$query=$CI->db->query("SELECT * FROM `$table`");
		$tab=array();		
		foreach ($query->result() as $row)array_push($tab,$row->word);
		return $tab;
	}
	
	public function strip_tags_javascript($chaine_body_html){
		$modele_balises_scripts = "~(.+)<script.*</script>(.+)~i";
		$ereg_replace = preg_replace($modele_balises_scripts, "$1$2", $chaine_body_html);
		return $ereg_replace;
	}
	public function conversionEntitesHTML($chaine_body_texte_entites_html){

		$table_caracts_html = get_html_translation_table(HTML_ENTITIES);
		$table_html_caracts = array_flip($table_caracts_html);
		$chaine_sans_entitesHTML =  strtr($chaine_body_texte_entites_html, $table_html_caracts);
	
		return $chaine_sans_entitesHTML;
	}
	public function fractionner_chaine($allow, $chaine){
		$tab = array();
		$chaine =  mb_ereg_replace("[^a-z0-9$allow]", ' ',$chaine);
		//supprimer les 2 espaces
		$chaine =  mb_ereg_replace('\s[\s]+', ' ',$chaine);
		//fractionnement de la chaine par espace
		$tab =mb_split("\s", $chaine);
		return $tab;
	}
	public function filtrer_taille($chaine_array,$taille=2){
		$tab = array();
		foreach($chaine_array as $element)
		{
			if (mb_strlen($element) > $taille) 
				$tab[] = $element;
		}
		return $tab;
	}
	public function filtrer_vide($chaine_array){
		$mot_commun=self::mot_commun();
		foreach($chaine_array as $key=> $element) 
			if( $element=='' or in_array($element,$mot_commun) or strlen($element)<2) 
				unset($chaine_array[$key]);
		return $chaine_array;
	}
	public function calculer_poids($tableau_elems_occurrs, $coefficient){
		$tab_elements_poids = array();
		
		foreach($tableau_elems_occurrs as $elem => $occurr)
		{
			$tab_elements_poids[$elem] = $occurr * $coefficient;
		}
		return $tab_elements_poids;
	}
	public function calculer($chaine,$poids){
		//1:  Débalisage du corps du docuement des scripts (javascript)
		$chaine_body_html_sans_script = self::strip_tags_javascript($chaine);
		
		//2: Débalisage du corps du docuement des balises HTML
		 $chaine_body_texte_entites_html = strip_tags($chaine_body_html_sans_script);
		
		//3: Conversion des caractères HTML :  &eacute; etc.
		 $chaine_body_texte = self::conversionEntitesHTML($chaine_body_texte_entites_html);
		
		//4: Mise ne miniscule
		
		$chaine_body_texte = trim(strtolower($chaine_body_texte));
		
		//5: Fractionement en éléments
		$chaine_array=self::fractionner_chaine("éàèçûôêâîöïüëäù", $chaine_body_texte);
		
		
		//6: Filtrage par taille
		$chaine_array=self::filtrer_taille($chaine_array);
		
		//7: Filtrage par liste d'éléments_vides
		$chaine_array=self::filtrer_vide($chaine_array);
		
		//8: Calcul des  occurrences
		$tableau_elems_occurrs=array_count_values( $chaine_array );
		
		//9: Calcul des poids
		return $tab_body=self::calculer_poids($tableau_elems_occurrs, $poids);
	}
	private function mbStringToArray( $string){
		 $string = htmlentities($string, ENT_NOQUOTES, 'utf-8');
	 
		// remplacer les entités HTML pour avoir juste le premier caractères non accentués
		// Exemple : "&ecute;" => "e", "&Ecute;" => "E", "Ã " => "a" ...
		$string = preg_replace('#&([A-za-z])(?:acute|grave|cedil|circ|orn|ring|slash|th|tilde|uml);#', '\1', $string);
		// Supprimer tout le reste
		$string = preg_replace('#&[^;]+;#', '', $string);
		$sort_word=str_split($string);
		sort($sort_word);
		return $sort_word;
	} 
	public function save($tag=false){	
		
		$tab_body=self::calculer($this->chaine,$this->poids);// 2 point pour description
		/*//10: Fusion avec le head	
		$keywords_poids==self::calculer($this->keywords,5);// 5 point pour keywords
		$title_poids=self::calculer($this->prd_name, 6);//6 point pour Titre
	
		//Fusion le keywords avec le description avec le body
		$tab_fichier=merge_array($keywords_poids,$title_poids, $tab_body);
		*/
		//11: Mise ne base de données : termes :  id, mot, poids
		// Liste les mots commun
		$CI=get_instance();
		$CI->load->database();
		$tag_add=array();
		$itag=0;
		foreach($tab_body as $mot=>$poids){
			if(trim($mot)){
				$query_mot=$CI->db->get_where("index_product_word",array('word'=>$mot));
				//tester le mot qui exite dans tableau mot si il n'existe pas ajouter
				if ($query_mot->num_rows){
					$row = $query_mot->result() ;
					$id=$row[0]->id;
				}else{
					$sort_word=self::mbStringToArray($mot);
					$CI->db->insert('index_product_word', array('word'=>$mot,'sort'=>implode('',$sort_word)));
					$id= $CI->db->insert_id();
				}
				//ajouter le id de mot , poids , id de doccument
				
				$query_mot=$CI->db->get_where("index_word",array('id_word'=>'$id' , 'id_doc'=>$this->product_info_id));
				
				if ($query_mot->num_rows)
					$CI->db->query("UPDATE `index_word` SET  weight=weight+$poids WHERE 'id_word'='$id' and 'id_doc'='{$this->product_info_id}'");
				else $CI->db->insert('index_word', array('id_word'=>$id, 'id_doc'=>$this->product_info_id,'weight'=>$poids));
			}
		}
	}
	
}